<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // ES6 js新的语法 简洁 规范 严格
        // let 
        // 1. 会产生块级作用域
        // 2. 不会出现变量提升
        // 3. 产生一个暂时性死区
        // 4. let不能重复声明
        // 5. let定义的全局变量不会挂载到window对象身上

        // var temp = 1;
        // if(true){
        //     console.log(temp);//报错  真空
        //     let temp = 2;//不会产生变量提升
        // }


        // let a = 2;
        // let b = 3;
        // [a,b] = [b,a];

        // var obj = {username:'jack',age:20};
        // // var username = obj.username;
        // // var age = obj.age;
        // var {age,username:myname} = obj;
        // //有了别名，只能用别名，不能用原来的名字，会报错


        // 箭头函数
        // let fn = (a,b)=>a+b;
            
        // this的问题

        // 死记住

    //     特殊情况：
    //     1、定时器
    //     2、全局函数
    //     3、匿名函数 
    //     this指向的是window 

    //     1、btn.onclick this指向的是btn 

    //     1、call,apply,bind可以改变this的指向
    //         + call,apply绑定完this之后立马调用这个函数
    //         + bind先绑定好this,然后你想什么时候调用这个函数就什么时候调用这个函数
        
    //     1、箭头函数不会改变this的指向


    //     // var obj = {
    //     //     a:100,
    //     //     fn:function(){
    //     //         setTimeout(()=>{
    //     //             console.log(this.a)//100 
    //     //         })
    //     //     }
    //     // }

    //     // 1. 对象的方法不要用
    //     // 2. 构造函数不要用
    //     // 3. btn.onclick = callback 不要用

    //     // 剩余参数 ... 
    //     // let fn = (...args){

    //     // }

    //     // fn(2,3,4,5)

    //     // 扩展运算符

    //     var arr = [3,1,4,5,2];
    //     Math.max(...arr);


    //     var arr1 = [...arr];


    //     var arr1 = [2,3]
    //     var arr2 = [4,5]
    //    var arr = [...arr1,...arr2]

        // 解构赋值
        
        var fn = ({username,age})=>{
            console.log(username);
            console.log(age);
        }

        fn({username:'cxk',age:20})





        // const 
        // 1. 基本上和let一样的
        // 2. const
        //     + 基本数据类型不能重复赋值
        //     + 对象 只要不改变引用地址就不算错


        // console.log(a);
        // let a = 100;


        // {
        //     let a = 1;
        // }
        // console.log(a);

        // if(true){
        //     let a = 1;
        // }

        // for(let i=0;i<2;i++){

        // }

        // // 循环了几次，就会产生几个块级作用域
        // {
        //     let i = 0;

        // }

        // {
        //     let i = 1;
        // }

        // 数组的扩展

        // Array.from 把伪数组转换成一个真正的数组
        // 伪数组：NodeList对象、arguments 
        
        // var obj = {
        //     '0':2,
        //     '1':3,
        //     length:2 
        // }

        // find 
        // findIndex 
        // filter 
        // some 
        // includes 
        // map 映射
        // reduce
        // every  


        // var arr = [2,3,4];
        // //把一个数组映射成一个新的数组，按一定的规则（传入的回调函数）
        // var arr1 = arr.map(item=>item*item)
        // console.log(arr1);

        // everybody 所有的人
        // somebody  有些人 
        // 应用：点击打印当前的i值 (当前的i只在当前循环的这一次有效)

        // some 只有一个人符合就返回true 
        // every 只有所有的人都符合才返回true 

        // 对象解构实现让代码更加的简洁
        // 解构别名的使用
        //应用：函数参数的解构赋值

        // var arr = [2,5,6,7,8];
        // console.log(arr.every(item=>item>3));



        // var arr = [2,5,6,7,8];
        // // 求数组中的所有的元素项的和
        // var sum = arr.reduce((a,b)=>a+b); 
        // console.log(sum)

        // 字符串的方法 
        // startsWith  以什么开始
        // endsWith  以什么结束
        // repeat 没用

        // set 用得不多 面试 数组的去重

        // 还有一些我们会在后面课程中会讲
        // vue.js 
        // react.js 
    </script>
</body>
</html>